Function.prototype.bind2 = function () {
  console.log("arguments", arguments);
  // 取出所有的参数
  const args = Array.prototype.slice.call(arguments);
  console.log(args);

  //   要被 bind 的对象 位于参数的第一位
  const t = args.shift();

  // 原来的this 对象  fn1.bind() 中的 fn1
  const self = this;

  return function () {
    return self.apply(t, args);
  };
};

function fn1(a, b, c) {
  console.log("this", this);
  console.log(a, b, c);
  return "this is fn1 hh";
}

// const fn2 = fn1.bind({ x: 100 }, 10, 20, 30);
// fn2();

const fn3 = fn1.bind2({ x: 100 }, 10, 20, 30);
console.log(fn3());
